package com.spring.security.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

/**
 * @author HouKunLin
 */
@EnableWebMvc
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Autowired
    private ObjectMapper objectMapper;

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("HEAD", "OPTIONS", "GET", "POST", "PUT", "PATCH", "DELETE")
                .maxAge(3600);
    }

    /**
     * 添加转换器.
     * 说明一下这么做的原因。
     * 想要在 RestControllerAdvice 捕获 NoHandlerFoundException 404 错误，进行统一json格式化输出，
     * 结果会导致 application.properties 配置中的 spring.jackson.date-format 时间格式化失效，
     * 因此，在这里进行重新配置，以便时间格式化生效
     *
     * @param converters 转换器列表
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        // 定义时间格式转换器
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        converter.setObjectMapper(objectMapper);
        //将我们定义的时间格式转换器添加到转换器列表中,
        //这样 jackson 格式化时候但凡遇到Date类型就会转换成我们定义的格式
        converters.add(converter);
    }
}
